// 导入 express 模块
const express = require('express')
// 导入 cors 中间件
// const cors = require('cors')
const path = require('path')
// 导入将 jwt 字符串解析成 JSON字符串的包
const { expressjwt: expressJWT} = require('express-jwt')
const { TOKEN_KEY, TIME } = require('./config/jwt/index')
// const bodyParser = require('body-parser')

const ws = require('./utils/websocket')
// init()
// 创建 express 的服务器实例
const app = express()
// 将 cors 注册为全局中间件
// app.use(cors())
// app.use(bodyParser.raw({ type: '*/*' }));
//配置解析 `application/x-www-form-urlencoded` 格式的表单数据的中间件
app.use(express.urlencoded({ extended: false }))

/* 
    注册将jwt字符串转成JSON字符串的中间件
    expressJWT({ secret: TOKEN_KEY, algorithms: ['HS256'] })：解析token
    .unless() 用来指定哪些接口不需要访问权限
*/
app.use(expressJWT({ secret: TOKEN_KEY, algorithms: ['HS256'] }).unless({ 
    path: [/\/api\/out\/*/]
}))

// 响应数据的中间件
app.use(function (err, req, res, next) {
    // token 解析失败导致的错误
    if(err.status === 401) {
        return res.send({
            code: 401,
            message: '操作失败',
            data: { errMessage: '身份认证错误，没有有效token' }
        })
    }
    next()
})

app.use(function (req, res, next) {
    // status = 200 为成功； code = 201 为失败； 默认将 code 的值设置为 201，方便处理失败的情况
    res.operationFailed = function (err, code = 201) {
        res.send({
            // 状态
            code,
            // 状态描述，判断 err 是 错误对象 还是 字符串
            message: '操作失败',
            data: err instanceof Error ? err.message : err,
        })
    }
    next()
})

// 操作成功且返回状态为成功
app.use(function (req, res, next) {
    // 默认操作成功但是返回的状态为失败
    res.operationSuccess = function (status = 'failure', errCode = '', message = '', results = []) {
        let data
        status !== 'failure' ? data = { status: status, message: message, results: results } : data = { status: 'failure', errCode: errCode, errMessage: message, results: results }
        res.send({
            code: 200,
            message: '操作成功！',
            data: data,
        })
    }
    next()
})

/* 设置静态资源目录 */
app.use('/api/out/serverImage', express.static(path.join(__dirname, 'serverImage')))

// 导入并注册用户路由模块
const userRouter = require('./router/user')
app.use('/api', userRouter)

// 调用 app.listen 方法，指定端口号并启动web服务器
app.listen(3007, function () {
    console.log('api server running at http://127.0.0.1:3007')
})